﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SIGCBI.Entities;
using System.Data;
using System.Data.Entity;
using System.Data.Objects;

namespace SIGCBI.Repository
{
    public interface IDetalleGuiaEntradaRepository
    {
        List<DETALLE_GUIA_ENTRADA> GetAllDetalleGuiaByGuiaEntradaId(Int32 idGuia);
        List<DETALLE_GUIA_ENTRADA> GetFromDetalleGuiaByProductoNombreAndGuiaId(string descripcion, Int32 idGuia);
        DETALLE_GUIA_ENTRADA GetFromDetalleGuiaByProductoIdAndGuiaId(Int32 idproducto, Int32 idGuia);

        bool GetAllDetalleGuiaEntradasByGuiaEntradaId(int idGuiaEntrada);
        void RemoveDetalleGuiaEntradaByProductoIdAndGuiaEntradaId(int idProd, int idGuiaEntrada);


        List<DETALLE_GUIA_ENTRADA> GetFromKardexByNombreProducto_Fechas_IdProducto_OfGuiaEntrada(string descripcion, DateTime? fec1, DateTime? fec2, int IdProducto);
        List<DETALLE_GUIA_ENTRADA> GetAllFromKardexByIdProducto_OfGuiaEntrada(int IdProducto);
    }

    public class DetalleGuiaEntradaRepository : MasterDataAccess, IDetalleGuiaEntradaRepository
    {
       public List<DETALLE_GUIA_ENTRADA> GetFromDetalleGuiaByProductoNombreAndGuiaId(string descripcion, int idGuia)
        {
            if (descripcion != "")
            {
                var query = from c in Context.DETALLE_GUIA_ENTRADA.Include("PRODUCTO.UNIDAD_MEDIDA")
                            where (c.PRODUCTO.Nombre.ToUpper().Contains(descripcion.ToUpper()))
                            && (c.IdGuiaEntrada.Equals(idGuia))
                            select c;

                ObjectContext.Refresh(RefreshMode.StoreWins, query);

                return query.ToList();
            }
            else
            {
                var query = from c in Context.DETALLE_GUIA_ENTRADA.Include("PRODUCTO.UNIDAD_MEDIDA")
                            where c.IdGuiaEntrada.Equals(idGuia)
                            select c;

                ObjectContext.Refresh(RefreshMode.StoreWins, query);

                return query.ToList();
            }
        }

        public DETALLE_GUIA_ENTRADA GetFromDetalleGuiaByProductoIdAndGuiaId(int idproducto, int idGuia)
        {
            var query = from c in Context.DETALLE_GUIA_ENTRADA
                        where c.IdProducto.Equals(idproducto) && c.IdGuiaEntrada.Equals(idGuia)
                        select c;

            ObjectContext.Refresh(RefreshMode.StoreWins, query);

            return query.SingleOrDefault();
        }

        
        public void RemoveDetalleGuiaEntradaByProductoIdAndGuiaEntradaId(int idProd, int idGuiaEntrada)
        {
            var existe = Context.DETALLE_GUIA_ENTRADA.Where(c => c.IdGuiaEntrada.Equals(idGuiaEntrada)
                && c.PRODUCTO.ID.Equals(idProd)).SingleOrDefault();

            Context.DETALLE_GUIA_ENTRADA.Remove(existe);
            Context.SaveChanges();
        }



        public List<DETALLE_GUIA_ENTRADA> GetAllDetalleGuiaByGuiaEntradaId(int idGuia)
        {
            var query = from c in Context.DETALLE_GUIA_ENTRADA.Include("PRODUCTO.UNIDAD_MEDIDA")
                        where c.IdGuiaEntrada.Equals(idGuia)
                        select c;

            ObjectContext.Refresh(RefreshMode.StoreWins, query);

            return query.ToList();
        }

        public bool GetAllDetalleGuiaEntradasByGuiaEntradaId(int idGuiaEntrada)
        {
            var query = from c in Context.DETALLE_GUIA_ENTRADA.Include("GUIA_ENTRADA")
                        where c.IdGuiaEntrada.Equals(idGuiaEntrada)
                        select c;

            ObjectContext.Refresh(RefreshMode.StoreWins, query);

            return query.Any();
        }


        public List<DETALLE_GUIA_ENTRADA> GetFromKardexByNombreProducto_Fechas_IdProducto_OfGuiaEntrada(string descripcion, DateTime? fec1, DateTime? fec2, int IdProducto)
        {
            if (descripcion != "")
            {
                var query = from c in Context.DETALLE_GUIA_ENTRADA.Include("GUIA_ENTRADA").Include("PRODUCTO.UNIDAD_MEDIDA")
                            where (c.PRODUCTO.Nombre.ToUpper().Contains(descripcion.ToUpper()) ||
                            c.PRODUCTO.Codigo.ToUpper().Contains(descripcion.ToUpper()))
                            && (c.IdProducto.Equals(IdProducto))
                            select c;

                ObjectContext.Refresh(RefreshMode.StoreWins, query);

                return query.ToList();
            }
            else if (fec1 != null && fec2 != null)
            {
                var query = from c in Context.DETALLE_GUIA_ENTRADA.Include("GUIA_ENTRADA").Include("PRODUCTO.UNIDAD_MEDIDA")
                            where c.GUIA_ENTRADA.FechaEntrada >= fec1.Value && c.GUIA_ENTRADA.FechaEntrada <= fec2.Value
                            select c;

                ObjectContext.Refresh(RefreshMode.StoreWins, query);

                return query.ToList();
            }
            else if (descripcion != "" && fec1 != null && fec2 != null)
            {
                var query = from c in Context.DETALLE_GUIA_ENTRADA.Include("GUIA_ENTRADA").Include("PRODUCTO.UNIDAD_MEDIDA")
                            where (c.PRODUCTO.Nombre.ToUpper().Contains(descripcion.ToUpper()) ||
                            c.PRODUCTO.Codigo.ToUpper().Contains(descripcion.ToUpper()))
                            && c.GUIA_ENTRADA.FechaEntrada >= fec1.Value && c.GUIA_ENTRADA.FechaEntrada <= fec2.Value
                            && (c.IdProducto.Equals(IdProducto))
                            select c;

                ObjectContext.Refresh(RefreshMode.StoreWins, query);

                return query.ToList();
            }
            else
            {
                var query = from c in Context.DETALLE_GUIA_ENTRADA.Include("GUIA_ENTRADA").Include("PRODUCTO.UNIDAD_MEDIDA")
                            where c.IdProducto.Equals(IdProducto)
                            select c;

                ObjectContext.Refresh(RefreshMode.StoreWins, query);

                return query.ToList();
            }
        }

        public List<DETALLE_GUIA_ENTRADA> GetAllFromKardexByIdProducto_OfGuiaEntrada(int IdProducto)
        {
            var query = from c in Context.DETALLE_GUIA_ENTRADA.Include("PRODUCTO.UNIDAD_MEDIDA")
                        where c.IdProducto.Equals(IdProducto)
                        select c;

            ObjectContext.Refresh(RefreshMode.StoreWins, query);

            return query.ToList();
        }
    }
}
